/*
 * Copyright (c) zhg2yqq.com Corp.
 * All Rights Reserved.
 */
package com.zhg2yqq.wheels.common.response;

import org.springframework.context.MessageSource;
import org.springframework.context.NoSuchMessageException;
import org.springframework.context.i18n.LocaleContextHolder;

import cn.hutool.core.text.CharSequenceUtil;

/**
 * @author zhg2yqq, 2022年11月28日
 * @version zhg2yqq v1.0
 */
public class RestResponse<T> extends BaseResponse {
    private static final long serialVersionUID = 1L;

    private T data;

    /**
     * 无返回值的成功响应
     */
    public static <T> RestResponse<T> success() {
        return build(BaseResponseCode.SUCCESS);
    }

    /**
     * 包含返回值的成功相应
     */
    public static <T> RestResponse<T> success(T data) {
        return build(BaseResponseCode.SUCCESS, data);
    }

    /**
     * 未知异常，返回系统繁忙响应<br/>
     * 谨慎使用，接口尽量返回明确的错误信息
     */
    public static <T> RestResponse<T> fail() {
        return build(BaseResponseCode.FAIL);
    }

    /**
     * 未知异常，返回系统繁忙响应
     *
     * @param data 错误信息
     */
    public static <T> RestResponse<T> fail(T data) {
        return build(BaseResponseCode.FAIL, data);
    }

    /**
     * 包含具体错误信息的响应
     *
     * @param respCode
     */
    public static <T> RestResponse<T> fail(IResponseCode respCode) {
        return build(respCode);
    }

    /**
     * 包含数据的错误响应
     *
     * @param respCode
     * @param data
     */
    public static <T> RestResponse<T> fail(IResponseCode respCode, T data) {
        return build(respCode, data);
    }

    /**
     * 构建自定义响应
     *
     * @param respCode
     */
    public static <T> RestResponse<T> build(IResponseCode respCode) {
        return new RestResponse<>(respCode.getCode(), respCode.getDescription());
    }

    /**
     * 构建带返回数据的响应
     *
     * @param respCode
     * @param data
     */
    public static <T> RestResponse<T> build(IResponseCode respCode, T data) {
        return build(respCode.getCode(), data);
    }

    /**
     * 构建自定义message内容的相应<br/>
     * 比如统一异常处理中的字段校验未通过异常,消息内容为自定义的字段错误信息
     *
     * @param code 状态码
     */
    public static <T> RestResponse<T> build(String code) {
        return new RestResponse<>(code, null);
    }

    /**
     * 构建自定义message内容的相应<br/>
     * 比如统一异常处理中的字段校验未通过异常,消息内容为自定义的字段错误信息
     *
     * @param code 状态码
     * @param data 返回的数据
     */
    public static <T> RestResponse<T> build(String code, T data) {
        return new RestResponse<>(code, null, data);
    }

    /**
     * 构建自定义message内容的相应<br/>
     * 比如统一异常处理中的字段校验未通过异常,消息内容为自定义的字段错误信息
     *
     * @param code    状态码
     * @param message 默认消息
     */
    public static <T> RestResponse<T> buildWithMessage(String code, String message) {
        return new RestResponse<>(code, message);
    }

    public boolean isSuccess() {
        return BaseResponseCode.SUCCESS.getCode().equals(super.code);
    }

    /**
     * 根据code国际化message
     *
     * @param messageSource
     * @param args
     * @return
     */
    public RestResponse<T> formateLocalMessage(MessageSource messageSource, Object... args) {
        try {
            message = messageSource.getMessage(getCode(), args,
                    LocaleContextHolder.getLocale());
        } catch (NoSuchMessageException e) {
            message = CharSequenceUtil.indexedFormat(getMessage(), args);
        }
        return this;
    }

    public T getData() {
        return data;
    }

    private RestResponse(String code, String message) {
        super(code, message);
    }

    private RestResponse(String code, String message, T data) {
        this(code, message);
        this.data = data;
    }
}
